home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / xml / dom / minidom.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  60KB  |  2,118 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''minidom.py -- a lightweight DOM implementation.
  5.  
  6. parse("foo.xml")
  7.  
  8. parseString("<foo><bar/></foo>")
  9.  
  10. Todo:
  11. =====
  12.  * convenience methods for getting elements and text.
  13.  * more testing
  14.  * bring some of the writer and linearizer code into conformance with this
  15.         interface
  16.  * SAX 2 namespaces
  17. '''
  18. import xml.dom as xml
  19. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  20. from xml.dom.minicompat import *
  21. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  22. _TupleType = type(())
  23. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  24.  
  25. class Node(xml.dom.Node, GetattrMagic):
  26.     namespaceURI = None
  27.     parentNode = None
  28.     ownerDocument = None
  29.     nextSibling = None
  30.     previousSibling = None
  31.     prefix = EMPTY_PREFIX
  32.     
  33.     def __nonzero__(self):
  34.         return True
  35.  
  36.     
  37.     def toxml(self, encoding = None):
  38.         return self.toprettyxml('', '', encoding)
  39.  
  40.     
  41.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  42.         writer = _get_StringIO()
  43.         if encoding is not None:
  44.             import codecs as codecs
  45.             writer = codecs.lookup(encoding)[3](writer)
  46.         
  47.         if self.nodeType == Node.DOCUMENT_NODE:
  48.             self.writexml(writer, '', indent, newl, encoding)
  49.         else:
  50.             self.writexml(writer, '', indent, newl)
  51.         return writer.getvalue()
  52.  
  53.     
  54.     def hasChildNodes(self):
  55.         if self.childNodes:
  56.             return True
  57.         else:
  58.             return False
  59.  
  60.     
  61.     def _get_childNodes(self):
  62.         return self.childNodes
  63.  
  64.     
  65.     def _get_firstChild(self):
  66.         if self.childNodes:
  67.             return self.childNodes[0]
  68.         
  69.  
  70.     
  71.     def _get_lastChild(self):
  72.         if self.childNodes:
  73.             return self.childNodes[-1]
  74.         
  75.  
  76.     
  77.     def insertBefore(self, newChild, refChild):
  78.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  79.             for c in tuple(newChild.childNodes):
  80.                 self.insertBefore(c, refChild)
  81.             
  82.             return newChild
  83.         
  84.         if newChild.nodeType not in self._child_node_types:
  85.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  86.         
  87.         if newChild.parentNode is not None:
  88.             newChild.parentNode.removeChild(newChild)
  89.         
  90.         if refChild is None:
  91.             self.appendChild(newChild)
  92.         else:
  93.             
  94.             try:
  95.                 index = self.childNodes.index(refChild)
  96.             except ValueError:
  97.                 raise xml.dom.NotFoundErr()
  98.  
  99.             if newChild.nodeType in _nodeTypes_with_children:
  100.                 _clear_id_cache(self)
  101.             
  102.             self.childNodes.insert(index, newChild)
  103.             newChild.nextSibling = refChild
  104.             refChild.previousSibling = newChild
  105.             if index:
  106.                 node = self.childNodes[index - 1]
  107.                 node.nextSibling = newChild
  108.                 newChild.previousSibling = node
  109.             else:
  110.                 newChild.previousSibling = None
  111.             newChild.parentNode = self
  112.         return newChild
  113.  
  114.     
  115.     def appendChild(self, node):
  116.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  117.             for c in tuple(node.childNodes):
  118.                 self.appendChild(c)
  119.             
  120.             return node
  121.         
  122.         if node.nodeType not in self._child_node_types:
  123.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  124.         elif node.nodeType in _nodeTypes_with_children:
  125.             _clear_id_cache(self)
  126.         
  127.         if node.parentNode is not None:
  128.             node.parentNode.removeChild(node)
  129.         
  130.         _append_child(self, node)
  131.         node.nextSibling = None
  132.         return node
  133.  
  134.     
  135.     def replaceChild(self, newChild, oldChild):
  136.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  137.             refChild = oldChild.nextSibling
  138.             self.removeChild(oldChild)
  139.             return self.insertBefore(newChild, refChild)
  140.         
  141.         if newChild.nodeType not in self._child_node_types:
  142.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  143.         
  144.         if newChild.parentNode is not None:
  145.             newChild.parentNode.removeChild(newChild)
  146.         
  147.         if newChild is oldChild:
  148.             return None
  149.         
  150.         
  151.         try:
  152.             index = self.childNodes.index(oldChild)
  153.         except ValueError:
  154.             raise xml.dom.NotFoundErr()
  155.  
  156.         self.childNodes[index] = newChild
  157.         newChild.parentNode = self
  158.         oldChild.parentNode = None
  159.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  160.             _clear_id_cache(self)
  161.         
  162.         newChild.nextSibling = oldChild.nextSibling
  163.         newChild.previousSibling = oldChild.previousSibling
  164.         oldChild.nextSibling = None
  165.         oldChild.previousSibling = None
  166.         if newChild.previousSibling:
  167.             newChild.previousSibling.nextSibling = newChild
  168.         
  169.         if newChild.nextSibling:
  170.             newChild.nextSibling.previousSibling = newChild
  171.         
  172.         return oldChild
  173.  
  174.     
  175.     def removeChild(self, oldChild):
  176.         
  177.         try:
  178.             self.childNodes.remove(oldChild)
  179.         except ValueError:
  180.             raise xml.dom.NotFoundErr()
  181.  
  182.         if oldChild.nextSibling is not None:
  183.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  184.         
  185.         if oldChild.previousSibling is not None:
  186.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  187.         
  188.         oldChild.nextSibling = None
  189.         oldChild.previousSibling = None
  190.         if oldChild.nodeType in _nodeTypes_with_children:
  191.             _clear_id_cache(self)
  192.         
  193.         oldChild.parentNode = None
  194.         return oldChild
  195.  
  196.     
  197.     def normalize(self):
  198.         L = []
  199.         for child in self.childNodes:
  200.             if child.nodeType == Node.TEXT_NODE:
  201.                 data = child.data
  202.                 if data and L and L[-1].nodeType == child.nodeType:
  203.                     node = L[-1]
  204.                     node.data = node.data + child.data
  205.                     node.nextSibling = child.nextSibling
  206.                     child.unlink()
  207.                 elif data:
  208.                     if L:
  209.                         L[-1].nextSibling = child
  210.                         child.previousSibling = L[-1]
  211.                     else:
  212.                         child.previousSibling = None
  213.                     L.append(child)
  214.                 else:
  215.                     child.unlink()
  216.             L[-1].nodeType == child.nodeType
  217.             if L:
  218.                 L[-1].nextSibling = child
  219.                 child.previousSibling = L[-1]
  220.             else:
  221.                 child.previousSibling = None
  222.             L.append(child)
  223.             if child.nodeType == Node.ELEMENT_NODE:
  224.                 child.normalize()
  225.                 continue
  226.         
  227.         self.childNodes[:] = L
  228.  
  229.     
  230.     def cloneNode(self, deep):
  231.         if not self.ownerDocument:
  232.             pass
  233.         return _clone_node(self, deep, self)
  234.  
  235.     
  236.     def isSupported(self, feature, version):
  237.         return self.ownerDocument.implementation.hasFeature(feature, version)
  238.  
  239.     
  240.     def _get_localName(self):
  241.         pass
  242.  
  243.     
  244.     def isSameNode(self, other):
  245.         return self is other
  246.  
  247.     
  248.     def getInterface(self, feature):
  249.         if self.isSupported(feature, None):
  250.             return self
  251.         else:
  252.             return None
  253.  
  254.     
  255.     def getUserData(self, key):
  256.         
  257.         try:
  258.             return self._user_data[key][0]
  259.         except (AttributeError, KeyError):
  260.             return None
  261.  
  262.  
  263.     
  264.     def setUserData(self, key, data, handler):
  265.         old = None
  266.         
  267.         try:
  268.             d = self._user_data
  269.         except AttributeError:
  270.             d = { }
  271.             self._user_data = d
  272.  
  273.         if d.has_key(key):
  274.             old = d[key][0]
  275.         
  276.         if data is None:
  277.             handler = None
  278.             if old is not None:
  279.                 del d[key]
  280.             
  281.         else:
  282.             d[key] = (data, handler)
  283.         return old
  284.  
  285.     
  286.     def _call_user_data_handler(self, operation, src, dst):
  287.         if hasattr(self, '_user_data'):
  288.             for data, handler in self._user_data.items():
  289.                 if handler is not None:
  290.                     handler.handle(operation, key, data, src, dst)
  291.                     continue
  292.             
  293.         
  294.  
  295.     
  296.     def unlink(self):
  297.         self.parentNode = None
  298.         self.ownerDocument = None
  299.         if self.childNodes:
  300.             for child in self.childNodes:
  301.                 child.unlink()
  302.             
  303.             self.childNodes = NodeList()
  304.         
  305.         self.previousSibling = None
  306.         self.nextSibling = None
  307.  
  308.  
  309. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  310. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  311. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  312.  
  313. def _append_child(self, node):
  314.     childNodes = self.childNodes
  315.     if childNodes:
  316.         last = childNodes[-1]
  317.         node.__dict__['previousSibling'] = last
  318.         last.__dict__['nextSibling'] = node
  319.     
  320.     childNodes.append(node)
  321.     node.__dict__['parentNode'] = self
  322.  
  323.  
  324. def _in_document(node):
  325.     while node is not None:
  326.         if node.nodeType == Node.DOCUMENT_NODE:
  327.             return True
  328.         
  329.         node = node.parentNode
  330.     return False
  331.  
  332.  
  333. def _write_data(writer, data):
  334.     '''Writes datachars to writer.'''
  335.     data = data.replace('&', '&').replace('<', '<')
  336.     data = data.replace('"', '"').replace('>', '>')
  337.     writer.write(data)
  338.  
  339.  
  340. def _get_elements_by_tagName_helper(parent, name, rc):
  341.     for node in parent.childNodes:
  342.         if node.nodeType == Node.ELEMENT_NODE:
  343.             if name == '*' or node.tagName == name:
  344.                 rc.append(node)
  345.             
  346.         _get_elements_by_tagName_helper(node, name, rc)
  347.     
  348.     return rc
  349.  
  350.  
  351. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  352.     for node in parent.childNodes:
  353.         if node.nodeType == Node.ELEMENT_NODE:
  354.             if localName == '*' or node.localName == localName:
  355.                 if nsURI == '*' or node.namespaceURI == nsURI:
  356.                     rc.append(node)
  357.                 
  358.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  359.             continue
  360.     
  361.     return rc
  362.  
  363.  
  364. class DocumentFragment(Node):
  365.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  366.     nodeName = '#document-fragment'
  367.     nodeValue = None
  368.     attributes = None
  369.     parentNode = None
  370.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  371.     
  372.     def __init__(self):
  373.         self.childNodes = NodeList()
  374.  
  375.  
  376.  
  377. class Attr(Node):
  378.     nodeType = Node.ATTRIBUTE_NODE
  379.     attributes = None
  380.     ownerElement = None
  381.     specified = False
  382.     _is_id = False
  383.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  384.     
  385.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  386.         d = self.__dict__
  387.         d['nodeName'] = d['name'] = qName
  388.         d['namespaceURI'] = namespaceURI
  389.         d['prefix'] = prefix
  390.         d['childNodes'] = NodeList()
  391.         self.childNodes.append(Text())
  392.  
  393.     
  394.     def _get_localName(self):
  395.         return self.nodeName.split(':', 1)[-1]
  396.  
  397.     
  398.     def _get_name(self):
  399.         return self.name
  400.  
  401.     
  402.     def _get_specified(self):
  403.         return self.specified
  404.  
  405.     
  406.     def __setattr__(self, name, value):
  407.         d = self.__dict__
  408.         if name in ('value', 'nodeValue'):
  409.             d['value'] = d['nodeValue'] = value
  410.             d2 = self.childNodes[0].__dict__
  411.             d2['data'] = d2['nodeValue'] = value
  412.             if self.ownerElement is not None:
  413.                 _clear_id_cache(self.ownerElement)
  414.             
  415.         elif name in ('name', 'nodeName'):
  416.             d['name'] = d['nodeName'] = value
  417.             if self.ownerElement is not None:
  418.                 _clear_id_cache(self.ownerElement)
  419.             
  420.         else:
  421.             d[name] = value
  422.  
  423.     
  424.     def _set_prefix(self, prefix):
  425.         nsuri = self.namespaceURI
  426.         if prefix == 'xmlns':
  427.             if nsuri and nsuri != XMLNS_NAMESPACE:
  428.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  429.             
  430.         
  431.         d = self.__dict__
  432.         d['prefix'] = prefix
  433.         if prefix is None:
  434.             newName = self.localName
  435.         else:
  436.             newName = '%s:%s' % (prefix, self.localName)
  437.         if self.ownerElement:
  438.             _clear_id_cache(self.ownerElement)
  439.         
  440.         d['nodeName'] = d['name'] = newName
  441.  
  442.     
  443.     def _set_value(self, value):
  444.         d = self.__dict__
  445.         d['value'] = d['nodeValue'] = value
  446.         if self.ownerElement:
  447.             _clear_id_cache(self.ownerElement)
  448.         
  449.         self.childNodes[0].data = value
  450.  
  451.     
  452.     def unlink(self):
  453.         elem = self.ownerElement
  454.         if elem is not None:
  455.             del elem._attrs[self.nodeName]
  456.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  457.             if self._is_id:
  458.                 self._is_id = False
  459.                 elem._magic_id_nodes -= 1
  460.                 self.ownerDocument._magic_id_count -= 1
  461.             
  462.         
  463.         for child in self.childNodes:
  464.             child.unlink()
  465.         
  466.         del self.childNodes[:]
  467.  
  468.     
  469.     def _get_isId(self):
  470.         if self._is_id:
  471.             return True
  472.         
  473.         doc = self.ownerDocument
  474.         elem = self.ownerElement
  475.         if doc is None or elem is None:
  476.             return False
  477.         
  478.         info = doc._get_elem_info(elem)
  479.         if info is None:
  480.             return False
  481.         
  482.         if self.namespaceURI:
  483.             return info.isIdNS(self.namespaceURI, self.localName)
  484.         else:
  485.             return info.isId(self.nodeName)
  486.  
  487.     
  488.     def _get_schemaType(self):
  489.         doc = self.ownerDocument
  490.         elem = self.ownerElement
  491.         if doc is None or elem is None:
  492.             return _no_type
  493.         
  494.         info = doc._get_elem_info(elem)
  495.         if info is None:
  496.             return _no_type
  497.         
  498.         if self.namespaceURI:
  499.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  500.         else:
  501.             return info.getAttributeType(self.nodeName)
  502.  
  503.  
  504. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  505. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  506. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  507.  
  508. class NamedNodeMap(NewStyle, GetattrMagic):
  509.     """The attribute list is a transient interface to the underlying
  510.     dictionaries.  Mutations here will change the underlying element's
  511.     dictionary.
  512.  
  513.     Ordering is imposed artificially and does not reflect the order of
  514.     attributes as found in an input document.
  515.     """
  516.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  517.     
  518.     def __init__(self, attrs, attrsNS, ownerElement):
  519.         self._attrs = attrs
  520.         self._attrsNS = attrsNS
  521.         self._ownerElement = ownerElement
  522.  
  523.     
  524.     def _get_length(self):
  525.         return len(self._attrs)
  526.  
  527.     
  528.     def item(self, index):
  529.         
  530.         try:
  531.             return self[self._attrs.keys()[index]]
  532.         except IndexError:
  533.             return None
  534.  
  535.  
  536.     
  537.     def items(self):
  538.         L = []
  539.         for node in self._attrs.values():
  540.             L.append((node.nodeName, node.value))
  541.         
  542.         return L
  543.  
  544.     
  545.     def itemsNS(self):
  546.         L = []
  547.         for node in self._attrs.values():
  548.             L.append(((node.namespaceURI, node.localName), node.value))
  549.         
  550.         return L
  551.  
  552.     
  553.     def has_key(self, key):
  554.         if isinstance(key, StringTypes):
  555.             return self._attrs.has_key(key)
  556.         else:
  557.             return self._attrsNS.has_key(key)
  558.  
  559.     
  560.     def keys(self):
  561.         return self._attrs.keys()
  562.  
  563.     
  564.     def keysNS(self):
  565.         return self._attrsNS.keys()
  566.  
  567.     
  568.     def values(self):
  569.         return self._attrs.values()
  570.  
  571.     
  572.     def get(self, name, value = None):
  573.         return self._attrs.get(name, value)
  574.  
  575.     __len__ = _get_length
  576.     
  577.     def __cmp__(self, other):
  578.         if self._attrs is getattr(other, '_attrs', None):
  579.             return 0
  580.         else:
  581.             return cmp(id(self), id(other))
  582.  
  583.     
  584.     def __getitem__(self, attname_or_tuple):
  585.         if isinstance(attname_or_tuple, _TupleType):
  586.             return self._attrsNS[attname_or_tuple]
  587.         else:
  588.             return self._attrs[attname_or_tuple]
  589.  
  590.     
  591.     def __setitem__(self, attname, value):
  592.         if isinstance(value, StringTypes):
  593.             
  594.             try:
  595.                 node = self._attrs[attname]
  596.             except KeyError:
  597.                 node = Attr(attname)
  598.                 node.ownerDocument = self._ownerElement.ownerDocument
  599.                 self.setNamedItem(node)
  600.  
  601.             node.value = value
  602.         elif not isinstance(value, Attr):
  603.             raise TypeError, 'value must be a string or Attr object'
  604.         
  605.         node = value
  606.         self.setNamedItem(node)
  607.  
  608.     
  609.     def getNamedItem(self, name):
  610.         
  611.         try:
  612.             return self._attrs[name]
  613.         except KeyError:
  614.             return None
  615.  
  616.  
  617.     
  618.     def getNamedItemNS(self, namespaceURI, localName):
  619.         
  620.         try:
  621.             return self._attrsNS[(namespaceURI, localName)]
  622.         except KeyError:
  623.             return None
  624.  
  625.  
  626.     
  627.     def removeNamedItem(self, name):
  628.         n = self.getNamedItem(name)
  629.         if n is not None:
  630.             _clear_id_cache(self._ownerElement)
  631.             del self._attrs[n.nodeName]
  632.             del self._attrsNS[(n.namespaceURI, n.localName)]
  633.             if n.__dict__.has_key('ownerElement'):
  634.                 n.__dict__['ownerElement'] = None
  635.             
  636.             return n
  637.         else:
  638.             raise xml.dom.NotFoundErr()
  639.  
  640.     
  641.     def removeNamedItemNS(self, namespaceURI, localName):
  642.         n = self.getNamedItemNS(namespaceURI, localName)
  643.         if n is not None:
  644.             _clear_id_cache(self._ownerElement)
  645.             del self._attrsNS[(n.namespaceURI, n.localName)]
  646.             del self._attrs[n.nodeName]
  647.             if n.__dict__.has_key('ownerElement'):
  648.                 n.__dict__['ownerElement'] = None
  649.             
  650.             return n
  651.         else:
  652.             raise xml.dom.NotFoundErr()
  653.  
  654.     
  655.     def setNamedItem(self, node):
  656.         if not isinstance(node, Attr):
  657.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  658.         
  659.         old = self._attrs.get(node.name)
  660.         if old:
  661.             old.unlink()
  662.         
  663.         self._attrs[node.name] = node
  664.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  665.         node.ownerElement = self._ownerElement
  666.         _clear_id_cache(node.ownerElement)
  667.         return old
  668.  
  669.     
  670.     def setNamedItemNS(self, node):
  671.         return self.setNamedItem(node)
  672.  
  673.     
  674.     def __delitem__(self, attname_or_tuple):
  675.         node = self[attname_or_tuple]
  676.         _clear_id_cache(node.ownerElement)
  677.         node.unlink()
  678.  
  679.     
  680.     def __getstate__(self):
  681.         return (self._attrs, self._attrsNS, self._ownerElement)
  682.  
  683.     
  684.     def __setstate__(self, state):
  685.         (self._attrs, self._attrsNS, self._ownerElement) = state
  686.  
  687.  
  688. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  689. AttributeList = NamedNodeMap
  690.  
  691. class TypeInfo(NewStyle):
  692.     __slots__ = ('namespace', 'name')
  693.     
  694.     def __init__(self, namespace, name):
  695.         self.namespace = namespace
  696.         self.name = name
  697.  
  698.     
  699.     def __repr__(self):
  700.         if self.namespace:
  701.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  702.         else:
  703.             return '<TypeInfo %r>' % self.name
  704.  
  705.     
  706.     def _get_name(self):
  707.         return self.name
  708.  
  709.     
  710.     def _get_namespace(self):
  711.         return self.namespace
  712.  
  713.  
  714. _no_type = TypeInfo(None, None)
  715.  
  716. class Element(Node):
  717.     nodeType = Node.ELEMENT_NODE
  718.     nodeValue = None
  719.     schemaType = _no_type
  720.     _magic_id_nodes = 0
  721.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  722.     
  723.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  724.         self.tagName = self.nodeName = tagName
  725.         self.prefix = prefix
  726.         self.namespaceURI = namespaceURI
  727.         self.childNodes = NodeList()
  728.         self._attrs = { }
  729.         self._attrsNS = { }
  730.  
  731.     
  732.     def _get_localName(self):
  733.         return self.tagName.split(':', 1)[-1]
  734.  
  735.     
  736.     def _get_tagName(self):
  737.         return self.tagName
  738.  
  739.     
  740.     def unlink(self):
  741.         for attr in self._attrs.values():
  742.             attr.unlink()
  743.         
  744.         self._attrs = None
  745.         self._attrsNS = None
  746.         Node.unlink(self)
  747.  
  748.     
  749.     def getAttribute(self, attname):
  750.         
  751.         try:
  752.             return self._attrs[attname].value
  753.         except KeyError:
  754.             return ''
  755.  
  756.  
  757.     
  758.     def getAttributeNS(self, namespaceURI, localName):
  759.         
  760.         try:
  761.             return self._attrsNS[(namespaceURI, localName)].value
  762.         except KeyError:
  763.             return ''
  764.  
  765.  
  766.     
  767.     def setAttribute(self, attname, value):
  768.         attr = self.getAttributeNode(attname)
  769.         if attr is None:
  770.             attr = Attr(attname)
  771.             d = attr.__dict__
  772.             d['value'] = d['nodeValue'] = value
  773.             d['ownerDocument'] = self.ownerDocument
  774.             self.setAttributeNode(attr)
  775.         elif value != attr.value:
  776.             d = attr.__dict__
  777.             d['value'] = d['nodeValue'] = value
  778.             if attr.isId:
  779.                 _clear_id_cache(self)
  780.             
  781.         
  782.  
  783.     
  784.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  785.         (prefix, localname) = _nssplit(qualifiedName)
  786.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  787.         if attr is None:
  788.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  789.             d = attr.__dict__
  790.             d['prefix'] = prefix
  791.             d['nodeName'] = qualifiedName
  792.             d['value'] = d['nodeValue'] = value
  793.             d['ownerDocument'] = self.ownerDocument
  794.             self.setAttributeNode(attr)
  795.         else:
  796.             d = attr.__dict__
  797.             if value != attr.value:
  798.                 d['value'] = d['nodeValue'] = value
  799.                 if attr.isId:
  800.                     _clear_id_cache(self)
  801.                 
  802.             
  803.             if attr.prefix != prefix:
  804.                 d['prefix'] = prefix
  805.                 d['nodeName'] = qualifiedName
  806.             
  807.  
  808.     
  809.     def getAttributeNode(self, attrname):
  810.         return self._attrs.get(attrname)
  811.  
  812.     
  813.     def getAttributeNodeNS(self, namespaceURI, localName):
  814.         return self._attrsNS.get((namespaceURI, localName))
  815.  
  816.     
  817.     def setAttributeNode(self, attr):
  818.         if attr.ownerElement not in (None, self):
  819.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  820.         
  821.         old1 = self._attrs.get(attr.name, None)
  822.         if old1 is not None:
  823.             self.removeAttributeNode(old1)
  824.         
  825.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  826.         if old2 is not None and old2 is not old1:
  827.             self.removeAttributeNode(old2)
  828.         
  829.         _set_attribute_node(self, attr)
  830.         if old1 is not attr:
  831.             return old1
  832.         
  833.         if old2 is not attr:
  834.             return old2
  835.         
  836.  
  837.     setAttributeNodeNS = setAttributeNode
  838.     
  839.     def removeAttribute(self, name):
  840.         
  841.         try:
  842.             attr = self._attrs[name]
  843.         except KeyError:
  844.             raise xml.dom.NotFoundErr()
  845.  
  846.         self.removeAttributeNode(attr)
  847.  
  848.     
  849.     def removeAttributeNS(self, namespaceURI, localName):
  850.         
  851.         try:
  852.             attr = self._attrsNS[(namespaceURI, localName)]
  853.         except KeyError:
  854.             raise xml.dom.NotFoundErr()
  855.  
  856.         self.removeAttributeNode(attr)
  857.  
  858.     
  859.     def removeAttributeNode(self, node):
  860.         if node is None:
  861.             raise xml.dom.NotFoundErr()
  862.         
  863.         
  864.         try:
  865.             self._attrs[node.name]
  866.         except KeyError:
  867.             raise xml.dom.NotFoundErr()
  868.  
  869.         _clear_id_cache(self)
  870.         node.unlink()
  871.         node.ownerDocument = self.ownerDocument
  872.  
  873.     removeAttributeNodeNS = removeAttributeNode
  874.     
  875.     def hasAttribute(self, name):
  876.         return self._attrs.has_key(name)
  877.  
  878.     
  879.     def hasAttributeNS(self, namespaceURI, localName):
  880.         return self._attrsNS.has_key((namespaceURI, localName))
  881.  
  882.     
  883.     def getElementsByTagName(self, name):
  884.         return _get_elements_by_tagName_helper(self, name, NodeList())
  885.  
  886.     
  887.     def getElementsByTagNameNS(self, namespaceURI, localName):
  888.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  889.  
  890.     
  891.     def __repr__(self):
  892.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  893.  
  894.     
  895.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  896.         writer.write(indent + '<' + self.tagName)
  897.         attrs = self._get_attributes()
  898.         a_names = attrs.keys()
  899.         a_names.sort()
  900.         for a_name in a_names:
  901.             writer.write(' %s="' % a_name)
  902.             _write_data(writer, attrs[a_name].value)
  903.             writer.write('"')
  904.         
  905.         if self.childNodes:
  906.             writer.write('>%s' % newl)
  907.             for node in self.childNodes:
  908.                 node.writexml(writer, indent + addindent, addindent, newl)
  909.             
  910.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  911.         else:
  912.             writer.write('/>%s' % newl)
  913.  
  914.     
  915.     def _get_attributes(self):
  916.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  917.  
  918.     
  919.     def hasAttributes(self):
  920.         if self._attrs:
  921.             return True
  922.         else:
  923.             return False
  924.  
  925.     
  926.     def setIdAttribute(self, name):
  927.         idAttr = self.getAttributeNode(name)
  928.         self.setIdAttributeNode(idAttr)
  929.  
  930.     
  931.     def setIdAttributeNS(self, namespaceURI, localName):
  932.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  933.         self.setIdAttributeNode(idAttr)
  934.  
  935.     
  936.     def setIdAttributeNode(self, idAttr):
  937.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  938.             raise xml.dom.NotFoundErr()
  939.         
  940.         if _get_containing_entref(self) is not None:
  941.             raise xml.dom.NoModificationAllowedErr()
  942.         
  943.  
  944.  
  945. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  946. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  947.  
  948. def _set_attribute_node(element, attr):
  949.     _clear_id_cache(element)
  950.     element._attrs[attr.name] = attr
  951.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  952.     attr.__dict__['ownerElement'] = element
  953.  
  954.  
  955. class Childless:
  956.     '''Mixin that makes childless-ness easy to implement and avoids
  957.     the complexity of the Node methods that deal with children.
  958.     '''
  959.     attributes = None
  960.     childNodes = EmptyNodeList()
  961.     firstChild = None
  962.     lastChild = None
  963.     
  964.     def _get_firstChild(self):
  965.         pass
  966.  
  967.     
  968.     def _get_lastChild(self):
  969.         pass
  970.  
  971.     
  972.     def appendChild(self, node):
  973.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  974.  
  975.     
  976.     def hasChildNodes(self):
  977.         return False
  978.  
  979.     
  980.     def insertBefore(self, newChild, refChild):
  981.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  982.  
  983.     
  984.     def removeChild(self, oldChild):
  985.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  986.  
  987.     
  988.     def replaceChild(self, newChild, oldChild):
  989.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  990.  
  991.  
  992.  
  993. class ProcessingInstruction(Childless, Node):
  994.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  995.     
  996.     def __init__(self, target, data):
  997.         self.target = self.nodeName = target
  998.         self.data = self.nodeValue = data
  999.  
  1000.     
  1001.     def _get_data(self):
  1002.         return self.data
  1003.  
  1004.     
  1005.     def _set_data(self, value):
  1006.         d = self.__dict__
  1007.         d['data'] = d['nodeValue'] = value
  1008.  
  1009.     
  1010.     def _get_target(self):
  1011.         return self.target
  1012.  
  1013.     
  1014.     def _set_target(self, value):
  1015.         d = self.__dict__
  1016.         d['target'] = d['nodeName'] = value
  1017.  
  1018.     
  1019.     def __setattr__(self, name, value):
  1020.         if name == 'data' or name == 'nodeValue':
  1021.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1022.         elif name == 'target' or name == 'nodeName':
  1023.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  1024.         else:
  1025.             self.__dict__[name] = value
  1026.  
  1027.     
  1028.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1029.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  1030.  
  1031.  
  1032.  
  1033. class CharacterData(Childless, Node):
  1034.     
  1035.     def _get_length(self):
  1036.         return len(self.data)
  1037.  
  1038.     __len__ = _get_length
  1039.     
  1040.     def _get_data(self):
  1041.         return self.__dict__['data']
  1042.  
  1043.     
  1044.     def _set_data(self, data):
  1045.         d = self.__dict__
  1046.         d['data'] = d['nodeValue'] = data
  1047.  
  1048.     _get_nodeValue = _get_data
  1049.     _set_nodeValue = _set_data
  1050.     
  1051.     def __setattr__(self, name, value):
  1052.         if name == 'data' or name == 'nodeValue':
  1053.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1054.         else:
  1055.             self.__dict__[name] = value
  1056.  
  1057.     
  1058.     def __repr__(self):
  1059.         data = self.data
  1060.         if len(data) > 10:
  1061.             dotdotdot = '...'
  1062.         else:
  1063.             dotdotdot = ''
  1064.         return '<DOM %s node "%s%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1065.  
  1066.     
  1067.     def substringData(self, offset, count):
  1068.         if offset < 0:
  1069.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1070.         
  1071.         if offset >= len(self.data):
  1072.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1073.         
  1074.         if count < 0:
  1075.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1076.         
  1077.         return self.data[offset:offset + count]
  1078.  
  1079.     
  1080.     def appendData(self, arg):
  1081.         self.data = self.data + arg
  1082.  
  1083.     
  1084.     def insertData(self, offset, arg):
  1085.         if offset < 0:
  1086.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1087.         
  1088.         if offset >= len(self.data):
  1089.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1090.         
  1091.         if arg:
  1092.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1093.         
  1094.  
  1095.     
  1096.     def deleteData(self, offset, count):
  1097.         if offset < 0:
  1098.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1099.         
  1100.         if offset >= len(self.data):
  1101.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1102.         
  1103.         if count < 0:
  1104.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1105.         
  1106.         if count:
  1107.             self.data = self.data[:offset] + self.data[offset + count:]
  1108.         
  1109.  
  1110.     
  1111.     def replaceData(self, offset, count, arg):
  1112.         if offset < 0:
  1113.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1114.         
  1115.         if offset >= len(self.data):
  1116.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1117.         
  1118.         if count < 0:
  1119.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1120.         
  1121.         if count:
  1122.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1123.         
  1124.  
  1125.  
  1126. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1127.  
  1128. class Text(CharacterData):
  1129.     nodeType = Node.TEXT_NODE
  1130.     nodeName = '#text'
  1131.     attributes = None
  1132.     
  1133.     def splitText(self, offset):
  1134.         if offset < 0 or offset > len(self.data):
  1135.             raise xml.dom.IndexSizeErr('illegal offset value')
  1136.         
  1137.         newText = self.__class__()
  1138.         newText.data = self.data[offset:]
  1139.         newText.ownerDocument = self.ownerDocument
  1140.         next = self.nextSibling
  1141.         if self.parentNode and self in self.parentNode.childNodes:
  1142.             if next is None:
  1143.                 self.parentNode.appendChild(newText)
  1144.             else:
  1145.                 self.parentNode.insertBefore(newText, next)
  1146.         
  1147.         self.data = self.data[:offset]
  1148.         return newText
  1149.  
  1150.     
  1151.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1152.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1153.  
  1154.     
  1155.     def _get_wholeText(self):
  1156.         L = [
  1157.             self.data]
  1158.         n = self.previousSibling
  1159.         while n is not None:
  1160.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1161.                 L.insert(0, n.data)
  1162.                 n = n.previousSibling
  1163.                 continue
  1164.             break
  1165.         n = self.nextSibling
  1166.         while n is not None:
  1167.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1168.                 L.append(n.data)
  1169.                 n = n.nextSibling
  1170.                 continue
  1171.             break
  1172.         return ''.join(L)
  1173.  
  1174.     
  1175.     def replaceWholeText(self, content):
  1176.         parent = self.parentNode
  1177.         n = self.previousSibling
  1178.         while n is not None:
  1179.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1180.                 next = n.previousSibling
  1181.                 parent.removeChild(n)
  1182.                 n = next
  1183.                 continue
  1184.             break
  1185.         n = self.nextSibling
  1186.         if not content:
  1187.             parent.removeChild(self)
  1188.         
  1189.         while n is not None:
  1190.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1191.                 next = n.nextSibling
  1192.                 parent.removeChild(n)
  1193.                 n = next
  1194.                 continue
  1195.             break
  1196.         if content:
  1197.             d = self.__dict__
  1198.             d['data'] = content
  1199.             d['nodeValue'] = content
  1200.             return self
  1201.         else:
  1202.             return None
  1203.  
  1204.     
  1205.     def _get_isWhitespaceInElementContent(self):
  1206.         if self.data.strip():
  1207.             return False
  1208.         
  1209.         elem = _get_containing_element(self)
  1210.         if elem is None:
  1211.             return False
  1212.         
  1213.         info = self.ownerDocument._get_elem_info(elem)
  1214.         if info is None:
  1215.             return False
  1216.         else:
  1217.             return info.isElementContent()
  1218.  
  1219.  
  1220. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1221. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1222.  
  1223. def _get_containing_element(node):
  1224.     c = node.parentNode
  1225.     while c is not None:
  1226.         if c.nodeType == Node.ELEMENT_NODE:
  1227.             return c
  1228.         
  1229.         c = c.parentNode
  1230.  
  1231.  
  1232. def _get_containing_entref(node):
  1233.     c = node.parentNode
  1234.     while c is not None:
  1235.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1236.             return c
  1237.         
  1238.         c = c.parentNode
  1239.  
  1240.  
  1241. class Comment(Childless, CharacterData):
  1242.     nodeType = Node.COMMENT_NODE
  1243.     nodeName = '#comment'
  1244.     
  1245.     def __init__(self, data):
  1246.         self.data = self.nodeValue = data
  1247.  
  1248.     
  1249.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1250.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1251.  
  1252.  
  1253.  
  1254. class CDATASection(Text):
  1255.     nodeType = Node.CDATA_SECTION_NODE
  1256.     nodeName = '#cdata-section'
  1257.     
  1258.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1259.         if self.data.find(']]>') >= 0:
  1260.             raise ValueError("']]>' not allowed in a CDATA section")
  1261.         
  1262.         writer.write('<![CDATA[%s]]>' % self.data)
  1263.  
  1264.  
  1265.  
  1266. class ReadOnlySequentialNamedNodeMap(NewStyle, GetattrMagic):
  1267.     __slots__ = ('_seq',)
  1268.     
  1269.     def __init__(self, seq = ()):
  1270.         self._seq = seq
  1271.  
  1272.     
  1273.     def __len__(self):
  1274.         return len(self._seq)
  1275.  
  1276.     
  1277.     def _get_length(self):
  1278.         return len(self._seq)
  1279.  
  1280.     
  1281.     def getNamedItem(self, name):
  1282.         for n in self._seq:
  1283.             if n.nodeName == name:
  1284.                 return n
  1285.                 continue
  1286.         
  1287.  
  1288.     
  1289.     def getNamedItemNS(self, namespaceURI, localName):
  1290.         for n in self._seq:
  1291.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1292.                 return n
  1293.                 continue
  1294.         
  1295.  
  1296.     
  1297.     def __getitem__(self, name_or_tuple):
  1298.         if isinstance(name_or_tuple, _TupleType):
  1299.             node = self.getNamedItemNS(*name_or_tuple)
  1300.         else:
  1301.             node = self.getNamedItem(name_or_tuple)
  1302.         if node is None:
  1303.             raise KeyError, name_or_tuple
  1304.         
  1305.         return node
  1306.  
  1307.     
  1308.     def item(self, index):
  1309.         if index < 0:
  1310.             return None
  1311.         
  1312.         
  1313.         try:
  1314.             return self._seq[index]
  1315.         except IndexError:
  1316.             return None
  1317.  
  1318.  
  1319.     
  1320.     def removeNamedItem(self, name):
  1321.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1322.  
  1323.     
  1324.     def removeNamedItemNS(self, namespaceURI, localName):
  1325.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1326.  
  1327.     
  1328.     def setNamedItem(self, node):
  1329.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1330.  
  1331.     
  1332.     def setNamedItemNS(self, node):
  1333.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1334.  
  1335.     
  1336.     def __getstate__(self):
  1337.         return [
  1338.             self._seq]
  1339.  
  1340.     
  1341.     def __setstate__(self, state):
  1342.         self._seq = state[0]
  1343.  
  1344.  
  1345. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1346.  
  1347. class Identified:
  1348.     '''Mix-in class that supports the publicId and systemId attributes.'''
  1349.     
  1350.     def _identified_mixin_init(self, publicId, systemId):
  1351.         self.publicId = publicId
  1352.         self.systemId = systemId
  1353.  
  1354.     
  1355.     def _get_publicId(self):
  1356.         return self.publicId
  1357.  
  1358.     
  1359.     def _get_systemId(self):
  1360.         return self.systemId
  1361.  
  1362.  
  1363.  
  1364. class DocumentType(Identified, Childless, Node):
  1365.     nodeType = Node.DOCUMENT_TYPE_NODE
  1366.     nodeValue = None
  1367.     name = None
  1368.     publicId = None
  1369.     systemId = None
  1370.     internalSubset = None
  1371.     
  1372.     def __init__(self, qualifiedName):
  1373.         self.entities = ReadOnlySequentialNamedNodeMap()
  1374.         self.notations = ReadOnlySequentialNamedNodeMap()
  1375.         if qualifiedName:
  1376.             (prefix, localname) = _nssplit(qualifiedName)
  1377.             self.name = localname
  1378.         
  1379.         self.nodeName = self.name
  1380.  
  1381.     
  1382.     def _get_internalSubset(self):
  1383.         return self.internalSubset
  1384.  
  1385.     
  1386.     def cloneNode(self, deep):
  1387.         if self.ownerDocument is None:
  1388.             clone = DocumentType(None)
  1389.             clone.name = self.name
  1390.             clone.nodeName = self.name
  1391.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1392.             if deep:
  1393.                 clone.entities._seq = []
  1394.                 clone.notations._seq = []
  1395.                 for n in self.notations._seq:
  1396.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1397.                     clone.notations._seq.append(notation)
  1398.                     n._call_user_data_handler(operation, n, notation)
  1399.                 
  1400.                 for e in self.entities._seq:
  1401.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1402.                     entity.actualEncoding = e.actualEncoding
  1403.                     entity.encoding = e.encoding
  1404.                     entity.version = e.version
  1405.                     clone.entities._seq.append(entity)
  1406.                     e._call_user_data_handler(operation, n, entity)
  1407.                 
  1408.             
  1409.             self._call_user_data_handler(operation, self, clone)
  1410.             return clone
  1411.         else:
  1412.             return None
  1413.  
  1414.     
  1415.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1416.         writer.write('<!DOCTYPE ')
  1417.         writer.write(self.name)
  1418.         if self.publicId:
  1419.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1420.         elif self.systemId:
  1421.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1422.         
  1423.         if self.internalSubset is not None:
  1424.             writer.write(' [')
  1425.             writer.write(self.internalSubset)
  1426.             writer.write(']')
  1427.         
  1428.         writer.write('>' + newl)
  1429.  
  1430.  
  1431.  
  1432. class Entity(Identified, Node):
  1433.     attributes = None
  1434.     nodeType = Node.ENTITY_NODE
  1435.     nodeValue = None
  1436.     actualEncoding = None
  1437.     encoding = None
  1438.     version = None
  1439.     
  1440.     def __init__(self, name, publicId, systemId, notation):
  1441.         self.nodeName = name
  1442.         self.notationName = notation
  1443.         self.childNodes = NodeList()
  1444.         self._identified_mixin_init(publicId, systemId)
  1445.  
  1446.     
  1447.     def _get_actualEncoding(self):
  1448.         return self.actualEncoding
  1449.  
  1450.     
  1451.     def _get_encoding(self):
  1452.         return self.encoding
  1453.  
  1454.     
  1455.     def _get_version(self):
  1456.         return self.version
  1457.  
  1458.     
  1459.     def appendChild(self, newChild):
  1460.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1461.  
  1462.     
  1463.     def insertBefore(self, newChild, refChild):
  1464.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1465.  
  1466.     
  1467.     def removeChild(self, oldChild):
  1468.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1469.  
  1470.     
  1471.     def replaceChild(self, newChild, oldChild):
  1472.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1473.  
  1474.  
  1475.  
  1476. class Notation(Identified, Childless, Node):
  1477.     nodeType = Node.NOTATION_NODE
  1478.     nodeValue = None
  1479.     
  1480.     def __init__(self, name, publicId, systemId):
  1481.         self.nodeName = name
  1482.         self._identified_mixin_init(publicId, systemId)
  1483.  
  1484.  
  1485.  
  1486. class DOMImplementation(DOMImplementationLS):
  1487.     _features = [
  1488.         ('core', '1.0'),
  1489.         ('core', '2.0'),
  1490.         ('core', '3.0'),
  1491.         ('core', None),
  1492.         ('xml', '1.0'),
  1493.         ('xml', '2.0'),
  1494.         ('xml', '3.0'),
  1495.         ('xml', None),
  1496.         ('ls-load', '3.0'),
  1497.         ('ls-load', None)]
  1498.     
  1499.     def hasFeature(self, feature, version):
  1500.         if version == '':
  1501.             version = None
  1502.         
  1503.         return (feature.lower(), version) in self._features
  1504.  
  1505.     
  1506.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1507.         if doctype and doctype.parentNode is not None:
  1508.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1509.         
  1510.         doc = self._create_document()
  1511.         if namespaceURI is None and qualifiedName is None:
  1512.             pass
  1513.         add_root_element = not (doctype is None)
  1514.         if not qualifiedName and add_root_element:
  1515.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1516.         
  1517.         if add_root_element:
  1518.             (prefix, localname) = _nssplit(qualifiedName)
  1519.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1520.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1521.             
  1522.             if prefix and not namespaceURI:
  1523.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1524.             
  1525.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1526.             if doctype:
  1527.                 doc.appendChild(doctype)
  1528.             
  1529.             doc.appendChild(element)
  1530.         
  1531.         if doctype:
  1532.             doctype.parentNode = doctype.ownerDocument = doc
  1533.         
  1534.         doc.doctype = doctype
  1535.         doc.implementation = self
  1536.         return doc
  1537.  
  1538.     
  1539.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1540.         doctype = DocumentType(qualifiedName)
  1541.         doctype.publicId = publicId
  1542.         doctype.systemId = systemId
  1543.         return doctype
  1544.  
  1545.     
  1546.     def getInterface(self, feature):
  1547.         if self.hasFeature(feature, None):
  1548.             return self
  1549.         else:
  1550.             return None
  1551.  
  1552.     
  1553.     def _create_document(self):
  1554.         return Document()
  1555.  
  1556.  
  1557.  
  1558. class ElementInfo(NewStyle):
  1559.     '''Object that represents content-model information for an element.
  1560.  
  1561.     This implementation is not expected to be used in practice; DOM
  1562.     builders should provide implementations which do the right thing
  1563.     using information available to it.
  1564.  
  1565.     '''
  1566.     __slots__ = ('tagName',)
  1567.     
  1568.     def __init__(self, name):
  1569.         self.tagName = name
  1570.  
  1571.     
  1572.     def getAttributeType(self, aname):
  1573.         return _no_type
  1574.  
  1575.     
  1576.     def getAttributeTypeNS(self, namespaceURI, localName):
  1577.         return _no_type
  1578.  
  1579.     
  1580.     def isElementContent(self):
  1581.         return False
  1582.  
  1583.     
  1584.     def isEmpty(self):
  1585.         '''Returns true iff this element is declared to have an EMPTY
  1586.         content model.'''
  1587.         return False
  1588.  
  1589.     
  1590.     def isId(self, aname):
  1591.         '''Returns true iff the named attribte is a DTD-style ID.'''
  1592.         return False
  1593.  
  1594.     
  1595.     def isIdNS(self, namespaceURI, localName):
  1596.         '''Returns true iff the identified attribute is a DTD-style ID.'''
  1597.         return False
  1598.  
  1599.     
  1600.     def __getstate__(self):
  1601.         return self.tagName
  1602.  
  1603.     
  1604.     def __setstate__(self, state):
  1605.         self.tagName = state
  1606.  
  1607.  
  1608.  
  1609. def _clear_id_cache(node):
  1610.     if node.nodeType == Node.DOCUMENT_NODE:
  1611.         node._id_cache.clear()
  1612.         node._id_search_stack = None
  1613.     elif _in_document(node):
  1614.         node.ownerDocument._id_cache.clear()
  1615.         node.ownerDocument._id_search_stack = None
  1616.     
  1617.  
  1618.  
  1619. class Document(Node, DocumentLS):
  1620.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1621.     nodeType = Node.DOCUMENT_NODE
  1622.     nodeName = '#document'
  1623.     nodeValue = None
  1624.     attributes = None
  1625.     doctype = None
  1626.     parentNode = None
  1627.     previousSibling = None
  1628.     nextSibling = None
  1629.     implementation = DOMImplementation()
  1630.     actualEncoding = None
  1631.     encoding = None
  1632.     standalone = None
  1633.     version = None
  1634.     strictErrorChecking = False
  1635.     errorHandler = None
  1636.     documentURI = None
  1637.     _magic_id_count = 0
  1638.     
  1639.     def __init__(self):
  1640.         self.childNodes = NodeList()
  1641.         self._elem_info = { }
  1642.         self._id_cache = { }
  1643.         self._id_search_stack = None
  1644.  
  1645.     
  1646.     def _get_elem_info(self, element):
  1647.         if element.namespaceURI:
  1648.             key = (element.namespaceURI, element.localName)
  1649.         else:
  1650.             key = element.tagName
  1651.         return self._elem_info.get(key)
  1652.  
  1653.     
  1654.     def _get_actualEncoding(self):
  1655.         return self.actualEncoding
  1656.  
  1657.     
  1658.     def _get_doctype(self):
  1659.         return self.doctype
  1660.  
  1661.     
  1662.     def _get_documentURI(self):
  1663.         return self.documentURI
  1664.  
  1665.     
  1666.     def _get_encoding(self):
  1667.         return self.encoding
  1668.  
  1669.     
  1670.     def _get_errorHandler(self):
  1671.         return self.errorHandler
  1672.  
  1673.     
  1674.     def _get_standalone(self):
  1675.         return self.standalone
  1676.  
  1677.     
  1678.     def _get_strictErrorChecking(self):
  1679.         return self.strictErrorChecking
  1680.  
  1681.     
  1682.     def _get_version(self):
  1683.         return self.version
  1684.  
  1685.     
  1686.     def appendChild(self, node):
  1687.         if node.nodeType not in self._child_node_types:
  1688.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1689.         
  1690.         if node.parentNode is not None:
  1691.             node.parentNode.removeChild(node)
  1692.         
  1693.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1694.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1695.         
  1696.         return Node.appendChild(self, node)
  1697.  
  1698.     
  1699.     def removeChild(self, oldChild):
  1700.         
  1701.         try:
  1702.             self.childNodes.remove(oldChild)
  1703.         except ValueError:
  1704.             raise xml.dom.NotFoundErr()
  1705.  
  1706.         oldChild.nextSibling = None
  1707.         oldChild.previousSibling = None
  1708.         oldChild.parentNode = None
  1709.         if self.documentElement is oldChild:
  1710.             self.documentElement = None
  1711.         
  1712.         return oldChild
  1713.  
  1714.     
  1715.     def _get_documentElement(self):
  1716.         for node in self.childNodes:
  1717.             if node.nodeType == Node.ELEMENT_NODE:
  1718.                 return node
  1719.                 continue
  1720.         
  1721.  
  1722.     
  1723.     def unlink(self):
  1724.         if self.doctype is not None:
  1725.             self.doctype.unlink()
  1726.             self.doctype = None
  1727.         
  1728.         Node.unlink(self)
  1729.  
  1730.     
  1731.     def cloneNode(self, deep):
  1732.         if not deep:
  1733.             return None
  1734.         
  1735.         clone = self.implementation.createDocument(None, None, None)
  1736.         clone.encoding = self.encoding
  1737.         clone.standalone = self.standalone
  1738.         clone.version = self.version
  1739.         for n in self.childNodes:
  1740.             childclone = _clone_node(n, deep, clone)
  1741.             clone.childNodes.append(childclone)
  1742.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1743.                 pass
  1744.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1745.                 clone.doctype = childclone
  1746.             
  1747.             childclone.parentNode = clone
  1748.         
  1749.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1750.         return clone
  1751.  
  1752.     
  1753.     def createDocumentFragment(self):
  1754.         d = DocumentFragment()
  1755.         d.ownerDocument = self
  1756.         return d
  1757.  
  1758.     
  1759.     def createElement(self, tagName):
  1760.         e = Element(tagName)
  1761.         e.ownerDocument = self
  1762.         return e
  1763.  
  1764.     
  1765.     def createTextNode(self, data):
  1766.         if not isinstance(data, StringTypes):
  1767.             raise TypeError, 'node contents must be a string'
  1768.         
  1769.         t = Text()
  1770.         t.data = data
  1771.         t.ownerDocument = self
  1772.         return t
  1773.  
  1774.     
  1775.     def createCDATASection(self, data):
  1776.         if not isinstance(data, StringTypes):
  1777.             raise TypeError, 'node contents must be a string'
  1778.         
  1779.         c = CDATASection()
  1780.         c.data = data
  1781.         c.ownerDocument = self
  1782.         return c
  1783.  
  1784.     
  1785.     def createComment(self, data):
  1786.         c = Comment(data)
  1787.         c.ownerDocument = self
  1788.         return c
  1789.  
  1790.     
  1791.     def createProcessingInstruction(self, target, data):
  1792.         p = ProcessingInstruction(target, data)
  1793.         p.ownerDocument = self
  1794.         return p
  1795.  
  1796.     
  1797.     def createAttribute(self, qName):
  1798.         a = Attr(qName)
  1799.         a.ownerDocument = self
  1800.         a.value = ''
  1801.         return a
  1802.  
  1803.     
  1804.     def createElementNS(self, namespaceURI, qualifiedName):
  1805.         (prefix, localName) = _nssplit(qualifiedName)
  1806.         e = Element(qualifiedName, namespaceURI, prefix)
  1807.         e.ownerDocument = self
  1808.         return e
  1809.  
  1810.     
  1811.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1812.         (prefix, localName) = _nssplit(qualifiedName)
  1813.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1814.         a.ownerDocument = self
  1815.         a.value = ''
  1816.         return a
  1817.  
  1818.     
  1819.     def _create_entity(self, name, publicId, systemId, notationName):
  1820.         e = Entity(name, publicId, systemId, notationName)
  1821.         e.ownerDocument = self
  1822.         return e
  1823.  
  1824.     
  1825.     def _create_notation(self, name, publicId, systemId):
  1826.         n = Notation(name, publicId, systemId)
  1827.         n.ownerDocument = self
  1828.         return n
  1829.  
  1830.     
  1831.     def getElementById(self, id):
  1832.         if self._id_cache.has_key(id):
  1833.             return self._id_cache[id]
  1834.         
  1835.         if not self._elem_info or self._magic_id_count:
  1836.             return None
  1837.         
  1838.         stack = self._id_search_stack
  1839.         if stack is None:
  1840.             stack = [
  1841.                 self.documentElement]
  1842.             self._id_search_stack = stack
  1843.         elif not stack:
  1844.             return None
  1845.         
  1846.         result = None
  1847.         for child in node.childNodes:
  1848.             if child.nodeType in _nodeTypes_with_children:
  1849.                 continue
  1850.             _[1][child]
  1851.             continue
  1852.             [](_[1])
  1853.             info = self._get_elem_info(node)
  1854.             if info:
  1855.                 for attr in node.attributes.values():
  1856.                     if attr.namespaceURI:
  1857.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1858.                             self._id_cache[attr.value] = node
  1859.                             if attr.value == id:
  1860.                                 result = node
  1861.                             elif not node._magic_id_nodes:
  1862.                                 break
  1863.                             
  1864.                         
  1865.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1866.                     if info.isId(attr.name):
  1867.                         self._id_cache[attr.value] = node
  1868.                         if attr.value == id:
  1869.                             result = node
  1870.                         elif not node._magic_id_nodes:
  1871.                             break
  1872.                         
  1873.                     attr.value == id
  1874.                     if attr._is_id:
  1875.                         self._id_cache[attr.value] = node
  1876.                         if attr.value == id:
  1877.                             result = node
  1878.                         elif node._magic_id_nodes == 1:
  1879.                             break
  1880.                         
  1881.                     attr.value == id
  1882.                 
  1883.             elif node._magic_id_nodes:
  1884.                 for attr in node.attributes.values():
  1885.                     if attr._is_id:
  1886.                         self._id_cache[attr.value] = node
  1887.                         if attr.value == id:
  1888.                             result = node
  1889.                         
  1890.                     attr.value == id
  1891.                 
  1892.             
  1893.             if result is not None:
  1894.                 break
  1895.                 continue
  1896.         return result
  1897.  
  1898.     
  1899.     def getElementsByTagName(self, name):
  1900.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1901.  
  1902.     
  1903.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1904.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1905.  
  1906.     
  1907.     def isSupported(self, feature, version):
  1908.         return self.implementation.hasFeature(feature, version)
  1909.  
  1910.     
  1911.     def importNode(self, node, deep):
  1912.         if node.nodeType == Node.DOCUMENT_NODE:
  1913.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1914.         elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1915.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1916.         
  1917.         return _clone_node(node, deep, self)
  1918.  
  1919.     
  1920.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1921.         if encoding is None:
  1922.             writer.write('<?xml version="1.0" ?>' + newl)
  1923.         else:
  1924.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1925.         for node in self.childNodes:
  1926.             node.writexml(writer, indent, addindent, newl)
  1927.         
  1928.  
  1929.     
  1930.     def renameNode(self, n, namespaceURI, name):
  1931.         if n.ownerDocument is not self:
  1932.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1933.         
  1934.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1935.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1936.         
  1937.         if namespaceURI != EMPTY_NAMESPACE:
  1938.             if ':' in name:
  1939.                 (prefix, localName) = name.split(':', 1)
  1940.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1941.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1942.                 
  1943.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1944.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1945.             
  1946.             prefix = None
  1947.             localName = name
  1948.         else:
  1949.             prefix = None
  1950.             localName = None
  1951.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1952.             element = n.ownerElement
  1953.             if element is not None:
  1954.                 is_id = n._is_id
  1955.                 element.removeAttributeNode(n)
  1956.             
  1957.         else:
  1958.             element = None
  1959.         d = n.__dict__
  1960.         d['prefix'] = prefix
  1961.         d['localName'] = localName
  1962.         d['namespaceURI'] = namespaceURI
  1963.         d['nodeName'] = name
  1964.         if n.nodeType == Node.ELEMENT_NODE:
  1965.             d['tagName'] = name
  1966.         else:
  1967.             d['name'] = name
  1968.             if element is not None:
  1969.                 element.setAttributeNode(n)
  1970.                 if is_id:
  1971.                     element.setIdAttributeNode(n)
  1972.                 
  1973.             
  1974.         return n
  1975.  
  1976.  
  1977. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1978.  
  1979. def _clone_node(node, deep, newOwnerDocument):
  1980.     '''
  1981.     Clone a node and give it the new owner document.
  1982.     Called by Node.cloneNode and Document.importNode
  1983.     '''
  1984.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1985.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1986.     else:
  1987.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1988.     if node.nodeType == Node.ELEMENT_NODE:
  1989.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1990.         for attr in node.attributes.values():
  1991.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1992.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1993.             a.specified = attr.specified
  1994.         
  1995.         if deep:
  1996.             for child in node.childNodes:
  1997.                 c = _clone_node(child, deep, newOwnerDocument)
  1998.                 clone.appendChild(c)
  1999.             
  2000.         
  2001.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  2002.         clone = newOwnerDocument.createDocumentFragment()
  2003.         if deep:
  2004.             for child in node.childNodes:
  2005.                 c = _clone_node(child, deep, newOwnerDocument)
  2006.                 clone.appendChild(c)
  2007.             
  2008.         
  2009.     elif node.nodeType == Node.TEXT_NODE:
  2010.         clone = newOwnerDocument.createTextNode(node.data)
  2011.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  2012.         clone = newOwnerDocument.createCDATASection(node.data)
  2013.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  2014.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  2015.     elif node.nodeType == Node.COMMENT_NODE:
  2016.         clone = newOwnerDocument.createComment(node.data)
  2017.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  2018.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  2019.         clone.specified = True
  2020.         clone.value = node.value
  2021.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  2022.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  2023.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  2024.         clone.ownerDocument = newOwnerDocument
  2025.         if deep:
  2026.             clone.entities._seq = []
  2027.             clone.notations._seq = []
  2028.             for n in node.notations._seq:
  2029.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  2030.                 notation.ownerDocument = newOwnerDocument
  2031.                 clone.notations._seq.append(notation)
  2032.                 if hasattr(n, '_call_user_data_handler'):
  2033.                     n._call_user_data_handler(operation, n, notation)
  2034.                     continue
  2035.             
  2036.             for e in node.entities._seq:
  2037.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  2038.                 entity.actualEncoding = e.actualEncoding
  2039.                 entity.encoding = e.encoding
  2040.                 entity.version = e.version
  2041.                 entity.ownerDocument = newOwnerDocument
  2042.                 clone.entities._seq.append(entity)
  2043.                 if hasattr(e, '_call_user_data_handler'):
  2044.                     e._call_user_data_handler(operation, n, entity)
  2045.                     continue
  2046.             
  2047.         
  2048.     else:
  2049.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  2050.     if hasattr(node, '_call_user_data_handler'):
  2051.         node._call_user_data_handler(operation, node, clone)
  2052.     
  2053.     return clone
  2054.  
  2055.  
  2056. def _nssplit(qualifiedName):
  2057.     fields = qualifiedName.split(':', 1)
  2058.     if len(fields) == 2:
  2059.         return fields
  2060.     else:
  2061.         return (None, fields[0])
  2062.  
  2063.  
  2064. def _get_StringIO():
  2065.     StringIO = StringIO
  2066.     import StringIO
  2067.     return StringIO()
  2068.  
  2069.  
  2070. def _do_pulldom_parse(func, args, kwargs):
  2071.     events = func(*args, **kwargs)
  2072.     (toktype, rootNode) = events.getEvent()
  2073.     events.expandNode(rootNode)
  2074.     events.clear()
  2075.     return rootNode
  2076.  
  2077.  
  2078. def parse(file, parser = None, bufsize = None):
  2079.     '''Parse a file into a DOM by filename or file object.'''
  2080.     if parser is None and not bufsize:
  2081.         expatbuilder = expatbuilder
  2082.         import xml.dom
  2083.         return expatbuilder.parse(file)
  2084.     else:
  2085.         pulldom = pulldom
  2086.         import xml.dom
  2087.         return _do_pulldom_parse(pulldom.parse, (file,), {
  2088.             'parser': parser,
  2089.             'bufsize': bufsize })
  2090.  
  2091.  
  2092. def parseString(string, parser = None):
  2093.     '''Parse a file into a DOM from a string.'''
  2094.     if parser is None:
  2095.         expatbuilder = expatbuilder
  2096.         import xml.dom
  2097.         return expatbuilder.parseString(string)
  2098.     else:
  2099.         pulldom = pulldom
  2100.         import xml.dom
  2101.         return _do_pulldom_parse(pulldom.parseString, (string,), {
  2102.             'parser': parser })
  2103.  
  2104.  
  2105. def getDOMImplementation(features = None):
  2106.     if features:
  2107.         if isinstance(features, StringTypes):
  2108.             features = domreg._parse_feature_string(features)
  2109.         
  2110.         for f, v in features:
  2111.             if not Document.implementation.hasFeature(f, v):
  2112.                 return None
  2113.                 continue
  2114.         
  2115.     
  2116.     return Document.implementation
  2117.  
  2118.